From 290ce9308f7b18f15398707e2d948f8745dd0be0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Kol=C3=A5s?= Date: Mon, 23 Apr 2012 01:07:14 +0200 Subject: [PATCH] allocate temporary buffers for fish conversion on the stack This avoids calling malloc/free for fishes that consists of multiple steps. --- babl/babl-fish-path.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/babl/babl-fish-path.c b/babl/babl-fish-path.c index 7914e0c..f51501e 100644 --- a/babl/babl-fish-path.c +++ b/babl/babl-fish-path.c @@ -410,6 +410,16 @@ babl_process (const Babl *cbabl, return -1; } +#include + +#define BABL_ALIGN 16 +static void inline *align_16 (unsigned char *ret) +{ + int offset = BABL_ALIGN - ((uintptr_t) ret) % BABL_ALIGN; + ret = ret + offset; + return ret; +} + static long process_conversion_path (BablList *path, const void *source_buffer, @@ -427,7 +437,7 @@ process_conversion_path (BablList *path, } else { - void *aux1_buffer = babl_malloc (n * sizeof (double) * 5); + void *aux1_buffer = align_16 (alloca (n * sizeof (double) * 5 + 16)); void *aux2_buffer = NULL; void *swap_buffer = NULL; int i; @@ -435,7 +445,7 @@ process_conversion_path (BablList *path, if (conversions > 2) { /* We'll need one more auxiliary buffer */ - aux2_buffer = babl_malloc (n * sizeof (double) * 5); + aux2_buffer = align_16 (alloca ((n * sizeof (double) * 5 + 16))); } /* The first conversion goes from source_buffer to aux1_buffer */ @@ -463,12 +473,6 @@ process_conversion_path (BablList *path, aux1_buffer, destination_buffer, n); - - /* Free auxiliary buffers */ - if (aux1_buffer) - babl_free (aux1_buffer); - if (aux2_buffer) - babl_free (aux2_buffer); } return n; -- 2.30.2